#include <vector>
#include <algorithm>
#include <iostream>

/*
树的DFS可以用来寻找树的「重心」
方法是：
1. 在DFS过程中记录每个节点的「自身+子树节点个数」（即自身往下的树的大小）与「最大子树大小」
2. 取「最大子树大小」与「总节点树」 - 「自身 + 子树节点个数」二者最大
  其实就是在求（自身往上的节点数）和（自身往下的节点数）
3. 如果这个最大值 <= 总节点数 / 2，那这个点就是「重心」
4. 一个树最多有两个重心，按需求进行选择
*/

using namespace std;

int allNodeCount = 10;
int center[2] = {-1}; // 重心

struct Node
{
    int id;
    int maxChild; // 最大子树大小
    int size; // 自身往下形成的树的大小
    vector<Node *> children;
    Node(int i)
    {
        id = i;
        maxChild = 0;
        size = 1; //至少是1
    }
};

struct Tree
{
    vector<Node *> nodeSet;
    Tree(int nodeSize)
    {
        nodeSet = vector<Node *>(nodeSize);
        for (int i = 0; i < nodeSize; ++i)
        {
            nodeSet[i] = new Node(i);
        }
    }
    void AddPath(int f, int t)
    {
        nodeSet[f]->children.push_back(nodeSet[t]);
    }
    //s为当前节点，f为父节点
    void DFS(int s, int f)
    {
        auto cur = nodeSet[s];
        for(auto n : cur->children)
        {
            if(n->id != f)
            {
                DFS(n->id, s);
                cur->size += n->size;
                cur->maxChild = max(cur->maxChild, n->size);
            }
        }
        cur->maxChild = max(cur->maxChild, allNodeCount - cur->size);
        if(cur->maxChild <= allNodeCount / 2)
        {
            if(center[0] == -1)
                center[0] = cur->id;
            else
                center[1] = cur->id;
        }          
    }
};

int main()
{
    cin >> allNodeCount;
    Tree *t = new Tree(allNodeCount + 1);
    int u, v;
    for (int i = 1; i < allNodeCount; ++i)
    {
        cin >> u >> v;
        t->AddPath(u, v);
        t->AddPath(v, u);
    }
    t->DFS(1, 1);
    cout << center[0] << '\n' << center[1];
    return 0;
}